package com.example.leetcode.矩阵;

/**
 * 矩阵置零
 * <p>
 * 给定一个 m x n 的矩阵，如果一个元素为 0 ，则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。
 * 输入：matrix = [[1,1,1],[1,0,1],[1,1,1]]
 * 输出：[[1,0,1],[0,0,0],[1,0,1]]
 * <p>
 * <p>
 * 使用标记数组
 * 思路和算法
 * 我们可以用两个标记数组分别记录每一行和每一列是否有零出现。
 * 具体地，我们首先遍历该数组一次，如果某个元素为 0，那么就将该元素所在的行和列所对应标记数组的位置置为 true。最后我们再次遍历该数组，用标记数组更新原数组即可。
 */
public class SetZeroes {

    public static void main(String[] args) {

    }

    public void setZeroes(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;

        // 行标记数组：记录某行是否出现0
        Boolean[] row = new Boolean[matrix.length];
        // 列标记数组：记录某列是否出现0
        Boolean[] column = new Boolean[matrix.length];

        // 初始化标记数组
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix[i][j] == 0) {
                    row[i] = true;
                    column[j] = true;
                }
            }
        }

        // 记数组更新原数组
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (row[i] || column[j]) {
                    matrix[i][j] = 0;
                }
            }
        }
    }
}
